/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polybook.utils;

import java.util.Calendar;
import java.util.Date;
import java.util.Random;

/**
 *
 * @author epulapp
 */
public class RandomUtils {
    
    /**
     * Objet random partage (principe singleton)
     */
    protected static Random sharedRandomObject;
    
    /**
     * Methode d'acces a l'objet random partage
     * @return l'objet random partage
     */
    protected static Random getSharedRandom() {
        if(sharedRandomObject == null) {
            sharedRandomObject = new Random();
        }
        return sharedRandomObject;
    }
    
    /**
     * Valeur minimale pour l'année
     */
    public final static int MINDATE = 1900;
    /**
     * Valeur maximale pour l'année
     */
    public final static int MAXDATE = 2012;
    /**
     * Valeur minimale pour le jour
     */
    public final static int MINDAY = 1;
    /**
     * Valeur maximale pour le jour
     */
    public final static int MAXDAY = 365;

    /**
     * Cette méthode retourne une chaine de caractères aléatoire de la taille de
     * length.
     *
     * @param length - Taille de la chaine.
     * @param number - TRUE si on veut la possibilité d'avoir des chiffres -
     * FALSE si on ne veut que des lettres
     * @return String - La chaine créée.
     */
    public static String generateString(int length, boolean number) {
        return RandomUtils.generateString(length, length, number);
    }

    /**
     * Cette méthode retourne une chaine de caractères aléatoire comprise entre
     * debut et fin.
     *
     * @param debut - Taille minimale de la chaine.
     * @param fin - Taille maximale de la chaine.
     * @param number - TRUE si on veut la possibilité d'avoir des chiffres -
     * FALSE si on ne veut que des lettres
     * @return String - La chaine créée.
     */
    public static String generateString(int debut, int fin, boolean number) {
        Random randomObject = RandomUtils.getSharedRandom();
        int length;
        if(debut == fin) {
            length = fin;
        } else {
            length = randomObject.nextInt(fin - debut) + debut;
        }
        
        String chars;
        int nbCaracteres;
        if (number) {
            chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //Lettres + Chiffres
            nbCaracteres = 62;
        } else {
            chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //Lettres seulement
            nbCaracteres = 52;
        }

        String randomString = "";
        for (int x = 0; x < length; x++) {
            int randomCharIndex = randomObject.nextInt(nbCaracteres);
            randomString += chars.charAt(randomCharIndex);
        }
        return randomString;
    }

    /**
     * Cette fonction retourne une date aléatoire.
     *
     * @return Date - La date aléatoire créée.
     */
    public static Date generateDate() {
        Random randomObject = new Random();

        int year = MINDATE + randomObject.nextInt(MAXDATE - MINDATE); // generate a year between 1900 and 2010;
        int dayOfYear = MINDAY + randomObject.nextInt(MAXDAY - MINDAY); // generate a number between 1 and 365 (or 366 if you need to handle leap year);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.DAY_OF_YEAR, dayOfYear);
        Date randomDoB = calendar.getTime();

        return randomDoB;
    }
}
